/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analiseSintatica.Regras.Expressoes;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;

/**
 *
 * @author linton
 * @author amferraz
 */
public class RegraOpIgualdade extends Regra {

    protected static Regra instancia;
    protected String estrutura = "<op_igualdade> ::=  '==' |  '!='";

    /**
     * Construtor privado necessario ao singleton
     */
    private RegraOpIgualdade() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraOpIgualdade getInstance() {
        if (instancia == null) {
            instancia = new RegraOpIgualdade();
        }
        return (RegraOpIgualdade) instancia;
    }

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
        NoArvore naoterminalElemento = new NoArvore("<op_igualdade>", false);

        //se o operador for de igualdade
        if (listaTokens.getFirst().getToken().equals("operador_igualdade")) {
            
            if ((listaTokens.getFirst().getLexema().equals("==")) ||
                    (listaTokens.getFirst().getLexema().equals("!="))) {
                naoterminalElemento.adicionaFilho(new NoArvore(listaTokens.pop().getLexema(), true));
            } else {
                throw new ErroSintaticoException();
            }
        } else {
            throw new ErroSintaticoException();
        }
        return naoterminalElemento;
    }

    @Override
    protected void setPrimeiro() {
        this.primeiro.add("==");
        this.primeiro.add("!=");
    }

    @Override
    protected void setSeguinte() {
        //this.seguinte.addAll(RegraRelacional.getInstance().getPrimeiro());
        seguinte.add("(");
        seguinte.add("{");
        seguinte.add("identificador");
        seguinte.add("numeroInteiro");
        seguinte.add("numeroFlutuante");
        seguinte.add("charconst");
        seguinte.add("++");
        seguinte.add("--");
        seguinte.add("&");
        seguinte.add("*");
    }
}
